import pandas as pd
import os

import pppoe


def deal_pppoe(path):
    # 读取CSV文件（假设是逗号分隔，带引号的格式）
    # 使用quotechar='"', escapechar='"'处理带引号的字段
    df = pd.read_csv(
        path,
        header=None,
        dtype=str,
        usecols=[0, 4, 5, 6, 7, 10],
        names=['account', 'ip', 'pon_raw', 'ontId', 'sn', 'online_time']  # 为列指定名称
    )
    print(df)

    # 向量化处理pon字段
    split_pon = df['pon_raw'].str.split('/', expand=True)
    valid_mask = (split_pon.shape[1] >= 3) & ~split_pon[1].isna() & ~split_pon[2].isna()
    df['pon'] = df['ip'].where(valid_mask) + '-' + split_pon[1].where(valid_mask) + '-' + split_pon[2].where(valid_mask)

    # 构建结果DataFrame（按目标列顺序排列）
    result_df = pd.DataFrame({
        "账号": df['account'],
        "sn": df['sn'],
        "pon": df['pon'],
        "ontId": df['ontId'],
        "上线时间": df['online_time']
    })

    # 生成输出文件路径
    res_path = os.path.splitext(path)[0] + ".parquet"
    result_df.to_parquet(res_path, index=False)


import pandas as pd
import os
from datetime import datetime


def cell_user_num(batch: str, start: str, start3: str, pppoe_path: str):
    # 1. 解析时间参数
    date1 = datetime.fromisoformat(start)
    date3 = datetime.fromisoformat(start3)

    # 2. 读取并处理PPPoE数据，筛选符合条件的账号
    # 假设PPPoE文件包含'account'和'online_time'列，可根据实际情况调整
    pppoe_df = pd.read_csv(
        pppoe_path,
        parse_dates=['上线时间'],  # 自动解析时间列
        usecols=['账号', '上线时间'],  # 只读取需要的列
        dtype={'账号': str}
    )

    # 向量化筛选，生成两个账号集合（利用集合实现O(1)查找）
    m1 = set(pppoe_df[pppoe_df['上线时间'] > date1]['账号'].unique())
    m3 = set(pppoe_df[pppoe_df['上线时间'] > date3]['账号'].unique())

    # 3. 读取基表数据并统计
    base_df = pd.read_csv(
        Batch.baseTable,
        usecols=['小区', 'account'],  # 只读取需要的列
        dtype={'小区': str, 'account': str}
    )

    # 4. 高效统计各社区数据
    # 先标记账号所属类别
    base_df['in_m1'] = base_df['account'].isin(m1)
    base_df['in_m3'] = base_df['account'].isin(m3)
    # 按社区分组统计
    result_df = base_df.groupby('小区').agg(
        n=('account', 'count'),  # 总用户数
        一个月=('in_m1', lambda x: sum(x)),  # m1中的用户数
        三个月=('in_m3', lambda x: sum(x))  # m3中的用户数
    ).reset_index()


    # 5. 写入结果到CSV
    output_dir = '/temp/pppoe'
    os.makedirs(output_dir, exist_ok=True)  # 确保目录存在
    output_path = f'{output_dir}/pppoe用户数{batch}.csv'
    result_df.to_csv(output_path, index=False, encoding='utf-8')

    return output_path


if __name__ == '__main__':
    import Batch
    # deal_pppoe(pppoe.get_pppoe_by_date("2025-07-31"))
    cell_user_num(Batch.batch, "2025-05-31 00:00:00", "2025-03-31 00:00:00", "D:\家宽\pppoe\PPPOE_20250731deal.csv")
